//泡泡炸弹
class Bomb{
    constructor(options,room,user){
        this.i=0; //泡泡的唯一ID
        this.x=0;
        this.y=0;
        this.color=0; //0代表普通蓝色泡泡  1代表红色泡泡  2代表紫色泡泡
        this.power=1; //炸弹爆炸威力 默认为一格
        this.room=room;
        this.user=user; //炸弹创建的用户是谁
        this.isBeBomb=false;
        this.createTimeTick=new Date().getTime(); //泡泡创建时间，用户计算剩余的爆炸时间
        Object.assign(this,options);
        this.timer=this.room.timerManager.setTimeout(function(){
            this.timer=null;
            if(!!this.room&&!this.isBeBomb){
                this.room.queue.pushTry(function(){
                    this.room.bomb(this.i);
                }.bind(this));
            }
        }.bind(this),3000);
    }
    //发送回客户端的泡泡信息
    getMessage(){
        return {
            userIndex:this.user.index,
            i:this.i,
            x:this.x,
            y:this.y,
            color:this.color,
            power:this.power
        }
    }
    //获取当前泡泡的引爆范围
    bomb(bombArray=[],destroyBoxes=[],bombArea=[]){
        this.isBeBomb=true;
        //清理自动引爆定时器
        if(!!this.timer){
            this.room.timerManager.clearTimeout(this.timer);
            this.timer=null;
        }
        //从房间泡泡中删除这个泡泡
        let bombIndex=this.room.bombs.findIndex(item=>{return item.i==this.i});
        if(bombIndex<0){
            return;
        }
        this.room.bombs.splice(bombIndex,1);
        //炸掉一个泡泡，则要给该用户返回一个泡泡数量
        this.user.bombCount++;
        //清理掉地图集中的该位置的泡泡
        //this.room.map.bombs[this.y][this.x]=0;
        //判断自己的位置是否有玩家，有则泡住
        if(bombArea.findIndex(item=>{return item[0]===this.x&&item[1]===this.y})<0){
            bombArea.push([this.x,this.y]);
        }
        //给爆掉的泡泡数组加入自己本身这个泡泡
        bombArray.push(this.i);
        //向上爆
        for(let i=1;i<=this.power;i++){
            let pos={x:this.x-i,y:this.y};
            if(!this.canBomb(pos.x,pos.y,bombArray,destroyBoxes,bombArea)){
                break;
            }
        }
        //向下爆
        for(let i=1;i<=this.power;i++){
            let pos={x:this.x+i,y:this.y};
            if(!this.canBomb(pos.x,pos.y,bombArray,destroyBoxes,bombArea)){
                break;
            }
        }
        //向左爆
        for(let i=1;i<=this.power;i++){
            let pos={x:this.x,y:this.y+i};
            if(!this.canBomb(pos.x,pos.y,bombArray,destroyBoxes,bombArea)){
                break;
            }
        }
        //向右爆
        for(let i=1;i<=this.power;i++){
            let pos={x:this.x,y:this.y-i};
            if(!this.canBomb(pos.x,pos.y,bombArray,destroyBoxes,bombArea)){
                break;
            }
        }
    }
    //判断该坐标点能否被引爆，如果能，该点直接引爆
    //bombArray用于存储本次被引爆的泡泡
    canBomb(x,y,bombArray,destroyBoxes,bombArea){
        //判断这个点是否有障碍物，如果有，直接返回false
        if(!this.room.map.obstacles[y]||!!this.room.map.obstacles[y][x]){
            return false;
        }
        //判断这个点是否有箱子，如果有，则引爆箱子
        if(!!this.room.map.boxes[y]&&!!this.room.map.boxes[y][x]){
            let itemIndex=destroyBoxes.findIndex(item=>{return item[0]===x&&item[1]===y});
            if(itemIndex<0){
                destroyBoxes.push([x,y]);
            }
            return false;
        }
        //判断该点是否有其他泡泡，如果有，引爆该泡泡
        let bomb=this.room.bombs.find(item=>{return item.x==x&&item.y==y});
        if(!!bomb){
            bomb.bomb(bombArray,destroyBoxes,bombArea);
            return false;
        }
        //如果该爆炸波没有碰到其他物体，则添加到爆炸点
        if(bombArea.findIndex(item=>{return item[0]===x&&item[1]===y})<0){
            bombArea.push([x,y]);
        }
        return true;
    }
}

module.exports=Bomb;